}
if (s->io_buffer_index >= s->io_buffer_size && s->nsector == 0) {
s->status = READY_STAT | SEEK_STAT;
- s->bmdma->status &= ~BM_STATUS_DMAING;
- s->bmdma->status |= BM_STATUS_INT;
- ide_set_irq(s);
#ifdef DEBUG_IDE_ATAPI
printf("dma status=0x%x\n", s->status);
#endif
if (n == 0) {
/* end of transfer */
s->status = READY_STAT | SEEK_STAT;
- s->bmdma->status &= ~BM_STATUS_DMAING;
- s->bmdma->status |= BM_STATUS_INT;
- ide_set_irq(s);
return 0;
}
if (n > MAX_MULT_SECTORS)
if (s->packet_transfer_size <= 0) {
s->status = READY_STAT;
s->nsector = (s->nsector & ~7) | ATAPI_INT_REASON_IO | ATAPI_INT_REASON_CD;
- s->bmdma->status &= ~BM_STATUS_DMAING;
- s->bmdma->status |= BM_STATUS_INT;
- ide_set_irq(s);
#ifdef DEBUG_IDE_ATAPI
printf("dma status=0x%x\n", s->status);
#endif
}
}
+static void ide_dma_finish(BMDMAState *bm)
+{
+ IDEState *s = bm->ide_if;
+
+ bm->status &= ~BM_STATUS_DMAING;
+ bm->status |= BM_STATUS_INT;
+ bm->dma_cb = NULL;
+ bm->ide_if = NULL;
+ ide_set_irq(s);
+}
+
/* XXX: full callback usage to prepare non blocking I/Os support -
error handling */
#ifdef DMA_MULTI_THREAD
cur_addr += 8;
}
/* end of transfer */
- the_end:
- bm->dma_cb = NULL;
- bm->ide_if = NULL;
+the_end:
+ ide_dma_finish(bm);
}
static void ide_dma_start(IDEState *s, IDEDMAFunc *dma_cb)